package com.hotel.controle;

import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import org.hibernate.Session;

import com.hotel.dao.CidadeDAO;
import com.hotel.dao.HospedeDAO;
import com.hotel.entidade.Cidade;
import com.hotel.entidade.Endereco;
import com.hotel.entidade.Hospede;
import com.hotel.util.HibernateUtil;

@ManagedBean(name = "hospedeBean")
@SessionScoped
public class HospedeControle {

	private HospedeDAO hospedeDAO;
	private CidadeDAO cidadeDAO;
	private Session session;
	private Hospede hospede;
	private Cidade cidade;
	private Endereco endereco;
	@SuppressWarnings("rawtypes")
	private DataModel listaHospedes;
	private String keyword = "";

	public Hospede getHospede() {
		return hospede;
	}

	public void setHospede(Hospede hospede) {
		this.hospede = hospede;
	}

	public Endereco getEndereco() {
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}
	
	public Cidade getCidade() {
		return cidade;
	}

	public void setCidade(Cidade cidade) {
		this.cidade = cidade;
	}

	public String getKeyword() {
		return keyword;
	}

	public void setKeyword(String keyword) {
		this.keyword = keyword;
	}

	@SuppressWarnings("rawtypes")
	public DataModel getListaHospedes() {
		if(this.listaHospedes == null){
			listarHospedes();
		}
		return listaHospedes;
	}

	public void listarHospedes() {
		session = HibernateUtil.configureSessionFactory().openSession();
		hospedeDAO = new HospedeDAO(session);
		List<Hospede> lista = hospedeDAO.listaTodos();
		listaHospedes = new ListDataModel<Hospede>(lista);
	}
	
	public void setListaHospedes(DataModel<Hospede> listaHospedes) {
		this.listaHospedes = listaHospedes;
	}

	public String preparaInserirHospede() {
		cidade = new Cidade();
		endereco = new Endereco();
		hospede = new Hospede();
		return "/hospedes/inserirHospede";
	}

	public String inserirHospede() {
		session = HibernateUtil.configureSessionFactory().openSession();
		cidadeDAO = new CidadeDAO(session);
		hospedeDAO = new HospedeDAO(session);
		try{
			endereco.setCidade(cidadeDAO.buscaPorId(getCidade().getCodigo()));
			hospede.setEndereco(endereco);
			hospedeDAO.insere(hospede);
		} catch (Exception e) {
			e.printStackTrace();
		}
		listarHospedes();
		return "/hospedes/buscaHospede";
	}
	
	public void preparaNovoHospede() {
		cidade = new Cidade();
		endereco = new Endereco();
		hospede = new Hospede();
	}
	
	public void novoHospede() {
		session = HibernateUtil.configureSessionFactory().openSession();
		endereco.setCidade(cidadeDAO.buscaPorId(getCidade().getCodigo()));
		hospede.setEndereco(endereco);
		hospedeDAO = new HospedeDAO(session);
		hospedeDAO.insere(hospede);
		listarHospedes();
	}

	public String preparaAlterarHospede() {
		hospede = (Hospede) (listaHospedes.getRowData());
		return "/hospedes/alterarHospede";
	}
	
	public String alterarHospede(){
		try{
			hospedeDAO = new HospedeDAO(session);
			cidadeDAO = new CidadeDAO(session);
			hospede.getEndereco().setCidade(cidadeDAO.buscaPorId(getHospede().getEndereco().getCidade().getCodigo()));
			hospede.getEndereco().getCidade().setEnderecos(null);
			hospedeDAO.atualisa(hospede);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "/hospedes/buscaHospede";
	}

	public String excluirHospede() {
		Hospede hosp = (Hospede) (listaHospedes.getRowData());
		hospedeDAO = new HospedeDAO(session);
		try{
			hospedeDAO.deleta(hosp);
		} catch(Exception e){
			e.printStackTrace();
		}
		listarHospedes();
		return "/hospedes/buscaHospede";
	}
	
	public String buscarHospede() {
		session = HibernateUtil.configureSessionFactory().openSession();
		hospedeDAO = new HospedeDAO(session);
		List<Hospede> lista = hospedeDAO.pesquisarHospede(this.getKeyword());
		listaHospedes = new ListDataModel<Hospede>(lista);
		this.keyword = null;
		return "/hospedes/buscaHospede";
	}

}
